/**
 * API响应类型定义
 */

import type {AxiosRequestConfig} from 'axios'

/**
 * 统一API响应格式
 */
export interface ApiResponse<T = any> {
  /** 响应码 */
  code: number
  /** 响应消息 */
  message: string
  /** 响应数据 */
  data?: T
  /** 响应时间戳 */
  timestamp: string
  /** 请求追踪ID */
  traceId?: string
  /** 错误详情 */
  details?: any
  /** 是否成功（方便判断） */
  success: boolean
}


/**
 * HTTP错误响应
 */
export interface ErrorResponse {
  /** 错误码 */
  code: number
  /** 错误消息 */
  message: string
  /** 错误详情 */
  details?: any
  /** 错误时间戳 */
  timestamp: string
}

/**
 * 请求配置选项
 */
export interface RequestConfig extends AxiosRequestConfig {
  /** 是否显示加载状态 */
  loading?: boolean
  /** 是否显示成功消息 */
  showSuccess?: boolean
  /** 是否显示错误消息 */
  showError?: boolean
  /** 自定义成功消息 */
  successMessage?: string
  /** 自定义错误消息 */
  errorMessage?: string
  /** 是否静默请求（不显示任何消息） */
  silent?: boolean
  /** 请求参数 */
  params?: any
}


/**
 * API响应处理结果
 */
export interface ApiResult<T = any> {
  /** 是否成功 */
  success: boolean
  /** 响应数据 */
  data?: T
  /** 错误信息 */
  error?: {
    code: number
    message: string
    details?: any
  }
  /** HTTP状态码 */
  status: number
  /** 响应头 */
  headers: Record<string, string>
}

/**
 * 批量操作请求
 */
export interface BatchRequest<T = any> {
  /** 操作的数据项列表 */
  items: T[]
  /** 操作类型 */
  action: string
  /** 额外参数 */
  params?: Record<string, any>
}

/**
 * 批量操作响应
 */
export interface BatchResponse {
  /** 成功数量 */
  successCount: number
  /** 失败数量 */
  failureCount: number
  /** 总数量 */
  totalCount: number
  /** 失败的项目列表 */
  failures?: Array<{
    item: any
    error: string
  }>
}

/**
 * 文件上传响应
 */
export interface UploadResponse {
  /** 文件ID */
  fileId: string
  /** 文件名 */
  fileName: string
  /** 文件大小 */
  fileSize: number
  /** 文件类型 */
  fileType: string
  /** 文件URL */
  fileUrl?: string
  /** 上传时间 */
  uploadTime: string
}

/**
 * 导出响应
 */
export interface ExportResponse {
  /** 导出任务ID */
  taskId: string
  /** 文件名 */
  fileName: string
  /** 下载URL */
  downloadUrl: string
  /** 文件大小 */
  fileSize?: number
  /** 过期时间 */
  expireTime?: string
}